package com.core.cloudbusiness.system.log.service;

import com.core.cloudcommon.CommonPageResponse;
import com.core.cloundbusinessapi.system.log.dto.LoginLogDTO;
import com.core.cloundbusinessapi.system.log.vo.LoginLogQueryVO;
import com.core.cloundbusinessapi.system.login.vo.CloudSystemLoginVO;
import com.core.cloundbusinessapi.system.user.dto.CloudSystemUserDTO;

import javax.servlet.http.HttpServletRequest;

/**
 * @author =====Lqj=====
 * @className LoginLogService
 * @description 登录日志服务接口
 * @create 2024/12/16 12:45
 **/
public interface LoginLogService {

    /**
     * 记录登录日志
     * @param loginVO 登录请求参数
     * @param userDTO 用户信息（可为null，登录失败时）
     * @param success 是否成功
     * @param failReason 失败原因
     * @param request HTTP请求
     * @param token 登录成功时的token
     * @return 日志ID
     */
    Long recordLoginLog(CloudSystemLoginVO loginVO, CloudSystemUserDTO userDTO, 
                       boolean success, String failReason, HttpServletRequest request, String token);

    /**
     * 记录退出日志
     * @param token 用户token
     * @param request HTTP请求
     */
    void recordLogoutLog(String token, HttpServletRequest request);

    /**
     * 分页查询登录日志
     * @param queryVO 查询参数
     * @return 分页结果
     */
    CommonPageResponse<LoginLogDTO> queryLoginLogs(LoginLogQueryVO queryVO);

    /**
     * 根据ID查询登录日志
     * @param id 日志ID
     * @return 登录日志
     */
    LoginLogDTO getLoginLogById(Long id);

    /**
     * 删除登录日志
     * @param id 日志ID
     * @return 是否成功
     */
    boolean deleteLoginLog(Long id);

    /**
     * 批量删除登录日志
     * @param ids 日志ID列表
     * @return 删除数量
     */
    int batchDeleteLoginLogs(Long[] ids);

    /**
     * 清理过期日志
     * @param days 保留天数
     * @return 清理数量
     */
    int cleanExpiredLogs(int days);

    /**
     * 获取用户最近登录记录
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 登录记录列表
     */
    java.util.List<LoginLogDTO> getRecentLoginLogs(Long userId, int limit);

    /**
     * 统计登录次数
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 登录次数
     */
    long countLoginTimes(Long userId, java.util.Date startTime, java.util.Date endTime);

    /**
     * 获取登录统计信息
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计信息Map
     */
    java.util.Map<String, Object> getLoginStatistics(java.util.Date startTime, java.util.Date endTime);

    /**
     * 异步记录登录日志（提高性能）
     * @param loginVO 登录请求参数
     * @param userDTO 用户信息
     * @param success 是否成功
     * @param failReason 失败原因
     * @param request HTTP请求
     * @param token 登录token
     */
    void recordLoginLogAsync(CloudSystemLoginVO loginVO, CloudSystemUserDTO userDTO,
                            boolean success, String failReason, HttpServletRequest request, String token);
}
